/*
将一个按照升序排列的有序数组，转换为一棵高度平衡二叉搜索树。

本题中，一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是：[0,-3,9,-10,null,5]，它可以表示下面这个高度平衡二叉搜索树：

      0
     / \
   -3   9
   /   /
 -10  5

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* retNode = NULL;
        if (nums.size() < 3)
        {
            switch(nums.size())
            {
                case 0:
                {
                    retNode = NULL;
                }
                break;
                case 1:
                {
                    retNode = new TreeNode(nums[0]);
                }
                break;
                case 2:
                {
                    retNode = new TreeNode(nums[0]);
                    retNode->right = new TreeNode(nums[1]);
                }
                break;
            }
        }
        else
        {
            int nCenterIndex = nums.size() / 2;
            vector<int> leftNums, rightNums;
            for (int i = 0; i < nums.size(); ++i)
            {
                if (i < nCenterIndex)
                {
                    leftNums.push_back(nums[i]);
                }
                else if (i > nCenterIndex)
                {
                    rightNums.push_back(nums[i]);
                }
            }

            retNode = new TreeNode(nums[nCenterIndex]);
            retNode->left = sortedArrayToBST(leftNums);
            retNode->right = sortedArrayToBST(rightNums);
        }

        return retNode;
    }
};